I want to parse the parameter vector passed through the `ml` command to a Mata evaluator.
To make things concrete, I have a model with 4 regressors in which 1, one of them is fixed, and the other 3 are random. Additionally, each random effect can have a polynomial expansion (let's imagine a Taylor expansion).
For the example, take this data (not really relevant)
Now here are the macros that describe the problem. As we can see below, the first (`x1`), second (`x2`), and the third variable (`x3`) have polynomial expansions of order 1, 2, and 3, respectively. This information is contained in the macro `poly`.
Now I will use the ml command to call a mata evaluator (`eval_gf0`) (see below). I added the extra terms using the `/` expression. So you can see, for example, that `x3_3` represents the parameter of the third polynomial expansion of the random variable `x3`.
Here is the evaluator `eval_gf0` together with the desired objects.
Any idea or hint about how to perform such operations? Thank you in advance.
PS1: When replicating this into Stata you need to put the evaluator BEFORE invoking it using the `ml` command.
PS2: Crossposted at Stackoverflow
To make things concrete, I have a model with 4 regressors in which 1, one of them is fixed, and the other 3 are random. Additionally, each random effect can have a polynomial expansion (let's imagine a Taylor expansion).
For the example, take this data (not really relevant)
Code:
clear all input id_ind id_cs_of_ind_n id_cs alternative x1 x2 x3 x_fix y 1 1 1 1 -2.4 .08 0.5 0.5 1 1 1 1 2 1.1 -1.8 0.65 0.15 0 end
Now here are the macros that describe the problem. As we can see below, the first (`x1`), second (`x2`), and the third variable (`x3`) have polynomial expansions of order 1, 2, and 3, respectively. This information is contained in the macro `poly`.
Code:
// Macros available
local fixed "x_fix"
local rand "x1 x2 x3"
local poly "1 2 3"
local lhs "y"
local rhs `fixed' `rand'
local kfix: word count `fixed'
local krnd: word count `rand'
mata: mata_kfix = strtoreal(st_local("kfix"))
mata: mata_krnd = strtoreal(st_local("krnd"))
Code:
ml model gf0 eval_gf0() (eq0: y = x_fix x1 x2 x3, noconst) /x2_2 /x3_2 /x3_3 matrix init = (1,2,3,4,5,6,7) mat li init ml init init ,copy ml maximize ,iter(0)
Code:
// Evaluator used by the ml command.
mata:
void eval_gf0(/*string scalar B_s*/
transmorphic scalar MM, real scalar todo,
real rowvector b, real colvector lnfj,
S, H)
{
external mata_kfix
external mata_krnd
kfix = mata_kfix
krnd = mata_krnd
// Transposing the original vector into a column row.
B = b'
// Total number of variables in equation 0
keq0 = kfix + krnd
/* This recover the fixed parameter */
MFIX = B[|1,1\kfix,1|]
/*
MFIX
1
*/
/* This recovers the first term in the polynomial expansion for the three random variables. */
MPOLY_0 = B[|(kfix+1),1 \ keq0,1|]
/*
MPOLY_0
1
+-----+
1 | 2 |
2 | 3 |
3 | 4 |
+-----+
*/
/*
Here I would like to create one matrix per polynomial order
and fill the missing spots with zeros when a given variable
does not have a polynomial of this order.
For example, in this case, I should get the following:
MPOLY_1
1
+-----+
1 | 0 | <- this 0 is because there is polynomial of order 2 for x1
2 | 5 |
3 | 6 |
+-----+
MPOLY_2
1
+-----+
1 | 0 | <- this 0 is because there is polynomial of order 3 for x1
2 | 0 | <- this 0 is because there is polynomial of order 3 for x2
3 | 7 |
+-----+
*/
exit(777)
}
end
PS1: When replicating this into Stata you need to put the evaluator BEFORE invoking it using the `ml` command.
PS2: Crossposted at Stackoverflow
